﻿using System;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sisocana.Core.Interfaces;
using Sisocana.Core.Models;
using Sisocana.Dal.Interfaces;
using Sisocana.Dal;
using Sisocana.Dal.EntityModels;



namespace Sisocana.Core
{
    public class Security : ISecurity
    {
        private IUsuarioService _usuarioService;
        private IUsuarioRepository _usuarioRepositorio;

        public Security()
            : this(new UsuarioService(), new UsuarioRepository())
        {
        }

        public Security(IUsuarioService usuarioService,IUsuarioRepository usuarioRepository)
        {
            _usuarioService = usuarioService ?? new UsuarioService();
            _usuarioRepositorio = usuarioRepository ?? new UsuarioRepository();
        }

        //Verifica si el usuario existe y si la contraseña es correcta
        public bool ValidateUser(string user, string pass)
        {
            //Busco el usuario
            UsuarioModel usu = _usuarioService.GetSingle(u => u.nombreUsuario.Trim() == user);
            
            //Checkeo si existe
            if (usu==null)
                return false;

            //Checkeo si la pass es correcta
            else
                return (usu.password.Trim() == pass);
        }

        public bool ChangePassword(string oldpass, string newpass, string user)
        {
            //Busco el usuario
            UsuarioModel usu = _usuarioService.GetSingle(u => u.nombreUsuario.Trim() == user);
            
            //Checkeo si existe
            if (usu!=null)
            {
                //Checkeo si la pass es correcta
                if (usu.password.Trim() == oldpass)
                {
                    usu.password = newpass;
                    _usuarioService.Update(usu);
                    return true;
                }
            }
            return false;
        }

        public bool HasPermissionGralAdmin(string user)
        {
            UsuarioModel usu = _usuarioService.GetSingle(u => u.nombreUsuario.Trim() == user.Trim());
            if (usu == null)
                return false;
            else
                return (usu.tipo == "G");
        }
        public bool HasPermissionSiteAdmin(string user, int siteId) 
        {
            Usuario us = _usuarioRepositorio.GetSingle(u => u.nombreUsuario.Trim() == user.Trim());

            return (us.Sitio.Count(s => s.id == siteId) == 1);
        }
    }
}
